/*
 * Controlador del sudoku.
 */
package sudoku.Controlador;

import java.awt.Color;
import java.awt.Component;
import java.awt.Desktop;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import javax.swing.*;
import sudoku.Extras.Archivo;
import sudoku.Extras.Puntaje;
import sudoku.Modelo.*;
import sudoku.Vista.*;

public class SudokuControlador implements ActionListener,MouseListener {
    private Juego juego;             //Juego Corriente
    private SudokuPanel sudokuPanel; //Panel A controlar.  
    private Puntaje puntaje;
    private int vista;
    private JFrame vistActual;
            
    /**
     * Constructor.
     *
     * @param vista  vista elegida.
     */
    public SudokuControlador(int vista) {
        juego = new Juego();
        sudokuPanel = new SudokuPanel();
        this.vista = vista;
        if (this.vista == 1){
            vistActual = new SudokuVista1(juego, sudokuPanel, this, true);    
        }else{
            vistActual = new SudokuVista2(juego, sudokuPanel, this, true);
        }
    }

    /**
     * Realiza accion despues de los eventos del usuario.
     *
     * @param e ActionEvent.
     */
    public void actionPerformed(ActionEvent e) {
        String AccComando = e.getActionCommand();
        if ("Nuevo".equals(AccComando) || "Facil".equals(AccComando) || "Medio".equals(AccComando) || "Dificil".equals(AccComando)  ){
            switch (AccComando) {
                case "Nuevo":
                    juego.nuevoJuego(juego.getDificultad());
                    break;
                case "Facil":
                    juego.nuevoJuego(1);
                    break;
                case "Medio":
                    juego.nuevoJuego(2);
                    break;
                case "Dificil":
                    juego.nuevoJuego(3);
                    break;
            }
            puntaje = new Puntaje();
        }
        else {
            switch (AccComando) {
                case "Chequear":
                    juego.comprobarJuego();
                    break;
                case "Ayuda":
                    juego.setAyuda(((JCheckBoxMenuItem) e.getSource()).isSelected());                
                    break;
                case "Top 10 Facil":
                    Puntaje.mostrarPuntaje(1);
                    break;
                case "Top 10 Medio":
                    Puntaje.mostrarPuntaje(2);
                    break;
                case "Top 10 Dificil":
                    Puntaje.mostrarPuntaje(3);
                    break;
                case "Guardar":
                    Archivo.GuardarObjeto(juego);
                    break;
                case "Abrir":
                    Archivo.CargarObjeto(juego);
                    break;
                case "Resolver":
                    juego.finalizar();
                    JOptionPane.showMessageDialog(null, "Juego Terminado");
                    break;
                case "Cambiar de Vista":                  
                    vistActual.dispose();
                    if (this.vista == 1){
                        this.vista = 2;
                        vistActual = new SudokuVista2(juego, sudokuPanel, this, false);
                    }else{
                        this.vista = 1;
                        vistActual = new SudokuVista1(juego, sudokuPanel, this, false);
                    }
                    break;
                case "Otros Sudokus":
                    try {
                        Desktop.getDesktop().browse(new URI("http://www.sudokumania.com.ar/"));
                    } catch (URISyntaxException | IOException ex) {}
                    break;
                case "Regla":
                    VistaReglas vr = new VistaReglas();
                    break;
                case "Acerca De":
                    VistaAcercaDe vad = new VistaAcercaDe();   
                    break;
                default:
                    juego.setNumSeleccionado(Integer.parseInt(e.getActionCommand()));
                break;
            }
        }      
    }



    /**
     * Recupera el evento si el usuario hace click en un campo del juego.
     * Si hace click con el boton principal con un numero seleccionado setea ese valor en el campo.
     * Si hace click con el boton secundario limpia el campo.
     * Siempre verifica si se llego al final o no.
     * 
     * @param e MouseEvent.
     */
    public void mousePressed(MouseEvent e) {
        if (sudokuPanel.isEnabled()){
            JPanel panel = (JPanel)e.getSource();
            Component component = panel.getComponentAt(e.getPoint());
            if (component instanceof Campo) {
                Campo campo = (Campo) component;
                int x = campo.getCampoX();
                int y = campo.getCampoY();
                if (vista ==1 && e.getButton() == MouseEvent.BUTTON1 && (juego.getNumero(x, y) == 0 || campo.getForeground().equals(Color.BLUE))) {
                    int numero = juego.getNumSeleccionado();
                    if (numero == -1)
                        return;
                    juego.setNumero(x, y, numero);
                    campo.setNumero(numero, true);
                }
                if (vista == 2 && e.getButton()== MouseEvent.BUTTON1){
                    int numero = juego.getNumero(x, y);
                    if (numero == 0){
                        juego.setNumero(x, y, 1);
                        campo.setNumero(1, true);
                        juego.setNumSeleccionado(1);
                    }
                    else{
                        if(campo.getForeground().equals(Color.BLUE)){
                            if (numero==9){                             
                                juego.setNumero(x, y, 1);
                                campo.setNumero(1, true);
                            }
                            else{
                                numero++;
                                juego.setNumero(x, y, numero);
                                campo.setNumero(numero, true);
                            } 
                                
                        }
                    }
                    
                } //
                else if (e.getButton() == MouseEvent.BUTTON3 && !campo.getForeground().equals(Color.BLACK)) {
                    juego.setNumero(x, y, 0);
                    campo.setNumero(0, false);
                }
                
                if(juego.comprobarJuego()){
                    try{
                        JOptionPane.showMessageDialog(null, "Juego Terminado");
                        sudokuPanel.setEnabled(false);
                        puntaje.finalizarPuntaje(juego.getDificultad());
                    } catch(Exception ex){}
                }
                sudokuPanel.update(juego, "Candidatos");
            }
        }else{
            JOptionPane.showMessageDialog(null, "Juego Terminado");
        }
    }
    
    @Override
    public void mouseClicked(MouseEvent e) {}

    @Override
    public void mouseReleased(MouseEvent e) {}

    @Override
    public void mouseEntered(MouseEvent e) {}

    @Override
    public void mouseExited(MouseEvent e) {}
}